<!DOCTYPE html>
<html lang="en">
    <head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <meta name="format-detection" content="telephone=no" />

  <title>
    03|基础篇经常说的CPU上下文切换是什么意思 | 迪克猪的博客
  </title>

  
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
  <link rel="manifest" href="/manifest.json" />
  <meta name="theme-color" content="#ffffff" />

  
  <link
    rel="stylesheet"
    href="https://unpkg.com/modern-normalize@0.6.0/modern-normalize.css"
  />

  
  
  
  
  <link rel="stylesheet" href="https://zsy619.github.io/style.min.f7761d111b74dd5c07f0111decee92938c12abc42e0fd319e1a07483e248b54e.css" integrity="sha256-93YdERt03VwH8BEd7O6Sk4wSq8QuD9MZ4aB0g&#43;JItU4=" />

  
  
    
  
</head>

    <body>
        <header id="header">
  <div class="header_container">
    <h1 class="sitetitle">
      <a href="https://zsy619.github.io" title="迪克猪的博客">迪克猪的博客</a>
    </h1>
    <nav class="navbar">
      <ul>
        <li><a href="https://zsy619.github.io">Home</a></li>
        
          <li>
            <a href="/post/">
              
              <span>LINUX性能优化</span>
            </a>
          </li>
        
          <li>
            <a href="/csapp/">
              
              <span>深入理解计算机系统_第三版</span>
            </a>
          </li>
        
          <li>
            <a href="/golang/">
              
              <span>golang</span>
            </a>
          </li>
        
          <li>
            <a href="/docker/">
              
              <span>容器</span>
            </a>
          </li>
        
          <li>
            <a href="/flutter/">
              
              <span>Flutter</span>
            </a>
          </li>
        
          <li>
            <a href="/know/">
              
              <span>知识点</span>
            </a>
          </li>
        
          <li>
            <a href="/categories/">
              
              <span>目录</span>
            </a>
          </li>
        
          <li>
            <a href="/about/">
              
              <span>关于</span>
            </a>
          </li>
        
        <li class="hide-sm"><a href="https://zsy619.github.io/index.xml" type="application/rss+xml">RSS</a></li>
      </ul>
    </nav>
  </div>
</header>

        
<section id="main">
  <article class="post content">
    <h2 class="title">03|基础篇经常说的CPU上下文切换是什么意思</h2>
    <div class="post_content">
      <h3 id="cpu上下文切换就是罪魁祸首">CPU上下文切换就是罪魁祸首</h3>
<h3 id="任务运行前的准备工作">任务运行前的准备工作</h3>
<p>CPU都要知道任务从哪里加载、从哪里开始运行，需要系统事先设置好CPU寄存器和程序计数器（Program Counter，PC）</p>
<ul>
<li>CPU寄存器：CPU内置容量小、速度极快的内存</li>
<li>程序计数器：用来存储CPU正在执行的指令位置、或将执行下一条指令的位置</li>
<li>这就是CPU上下文</li>
</ul>
<p><img src="../../images/20200528-1751-34.png" alt=""></p>
<ul>
<li>CPU上下文切换：把前一个CPU上下文（cpu寄存器及程序计数器）保存起来，然后加载新的任务的上下文到这些寄存器及程序计数器，然后跳转到寄存器及程序计数器所指的位置，运行新的任务</li>
<li>进程、线程是最常见的任务</li>
<li>CPU上下文场景分类：
<ul>
<li>进程上下文切换</li>
<li>线程上下文切换</li>
<li>中断上下文切换</li>
</ul>
</li>
</ul>
<h3 id="进程上下文切换">进程上下文切换</h3>
<p>linux特权等级，把进程运行空间分为：内核空间、用户空间</p>
<ul>
<li>内核空间：具有最高权限，可以访问所有资源。
<ul>
<li>在此运行的进程叫进程的内核态。</li>
</ul>
</li>
<li>用户空间：只访问受限资源，不能访问内存等硬件设备，必须通过系统调用陷入到内核中，才可以访问特权资源。
<ul>
<li>在次运行的进程叫进程的用户态。</li>
</ul>
</li>
<li>从用户态到内核态，需要经过系统调用来完成。
<ul>
<li>一次系统调用，发生了两次CPU上下文切换</li>
</ul>
</li>
</ul>
<p>进程上下文切换与系统调用的区分：</p>
<ul>
<li>进程上下文切换是从一个进程切换到另外一个进程</li>
<li>系统调用是一直同一个进程在运行</li>
<li>系统调用过程称为特权模式切换，而不是上下文切换</li>
<li>进程切换只发生在内核态</li>
<li>保存上下文和恢复上下文并不是”免费“的</li>
</ul>
<p><img src="../../images/20200528-1810-33.png" alt=""></p>
<p>Linux通过TLB（Translation Lookaside Buffer）管理虚拟内存到物理内存的映射</p>
<p>触发进程调用的场景：</p>
<ul>
<li>其一，为了保证所有进程可以得到公平调度，CPU 时间被划分为一段段的时间片，这些时间片再被轮流分配给各个进程。这样，当某个进程的时间片耗尽了，就会被系统挂起，切换到其它正在等待 CPU 的进程运行。</li>
<li>其二，进程在系统资源不足（比如内存不足）时，要等到资源满足后才可以运行，这个时候进程也会被挂起，并由系统调度其他进程运行。</li>
<li>其三，当进程通过睡眠函数  sleep 这样的方法将自己主动挂起时，自然也会重新调度。</li>
<li>其四，当有优先级更高的进程运行时，为了保证高优先级进程的运行，当前进程会被挂起，由高优先级进程来运行。</li>
<li>发生硬件中断时，CPU 上的进程会被中断挂起，转而执行内核中的中断服务程序。</li>
</ul>
<h3 id="线程上下文切换">线程上下文切换</h3>
<p>线程是调度的基本单位，而进程是资源拥有的基本单位</p>
<p>进程与线程区别：</p>
<ul>
<li>当进程只有一个线程时，可以认为进程就等于线程。</li>
<li>当进程拥有多个线程时，这些线程会共享相同的虚拟内存和全局变量等资源。这些资源在上下文切换时是不需要修改的。</li>
<li>另外，线程也有自己的私有数据，比如栈和寄存器等，这些在上下文切换时也是需要保存的。</li>
</ul>
<p>线程上下文切换场景：</p>
<ul>
<li>前后两个线程属于不同进程。此时，因为资源不共享，所以切换过程就跟进程上下文切换是一样。</li>
<li>前后两个线程属于同一个进程。此时，因为虚拟内存是共享的，所以在切换时，虚拟内存这些资源就保持不动，只需要切换线程的私有数据、寄存器等不共享的数据</li>
</ul>
<h3 id="中断上下文切换">中断上下文切换</h3>
<p>中断：cpu上下文切换；中断执行会打断进程的正常调度和执行</p>
<p>对同一个CPU来说，中断处理比进程拥有更高的优先级</p>

    </div>
    <div class="info post_meta">
      <time datetime=2020-05-27T12:24:00&#43;0800 class="date">Wednesday, May 27, 2020</time>
      
        <ul class="tags">
        
          <li> <a href="https://zsy619.github.io/tags/linux%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96">linux性能优化</a> </li>
        
          <li> <a href="https://zsy619.github.io/tags/linux">linux</a> </li>
        
        </ul>
      
      
    </div>
    <div class="clearfix"></div>
  </article>
  
    <div class="other_posts">
      
      <a href="https://zsy619.github.io/post/02%E5%9F%BA%E7%A1%80%E7%AF%87%E5%88%B0%E5%BA%95%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E7%90%86%E8%A7%A3%E5%B9%B3%E5%9D%87%E8%B4%9F%E8%BD%BD/" class="prev">02|基础篇--到底应该怎么理解平均负载</a>
      
      
      <a href="https://zsy619.github.io/post/04%E5%9F%BA%E7%A1%80%E7%AF%87%E7%BB%8F%E5%B8%B8%E8%AF%B4%E7%9A%84cpu%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D/" class="next">04|基础篇--经常说的CPU上下文切换是什么意思</a>
      
    </div>
    <aside id="comments">
</aside>

  
</section>

        <a id="back_to_top" title="Go To Top" href="#">
  <span>
    <svg viewBox="0 0 24 24">
      <path fill="none" d="M0 0h24v24H0z"></path>
      <path d="M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71z"></path>
    </svg>
  </span>
</a>

        <footer id="footer">
  <p>
    <span>&copy; 2021 <a href="https://zsy619.github.io" title="迪克猪的博客">迪克猪的博客</a> </span>
    <span>Built with <a rel="nofollow" target="_blank" href="https://gohugo.io">Hugo</a></span>
    <span>Theme by <a rel="nofollow" target="_blank" href="https://github.com/wayjam/hugo-theme-mixedpaper">WayJam</a></span>
  </p>

  <script src="https://zsy619.github.io/js/main.min.8b182175f5874aeed0acc0979345c98d4bde22208ec4f36cc1d6e3102acb4b10.js" integrity="sha256-ixghdfWHSu7QrMCXk0XJjUveIiCOxPNswdbjECrLSxA=" crossorigin="anonymous" async></script>
</footer>

    </body>
</html>
